#!/bin/sh

# 配置参数
HISTORY_FILE="$HOME/.clipboard-history"  # 剪贴板历史记录文件
MAX_ENTRIES=100                          # 最大历史记录条目数
# 支持的Git平台（已修正codeberg.com为codeberg.org，新增其他平台注释示例）
GIT_DOMAINS="gitee.com|github.com|codeberg.org"  
# TODO: 如需添加更多Git平台，取消下方注释并补充域名（用|分隔）
# GIT_DOMAINS="gitee.com|github.com|codeberg.org|gitlab.com|bitbucket.org|gitea.com"
# Git仓库正则：匹配HTTPS（https://xxx.org/owner/repo）和SSH（git@xxx.org:owner/repo）格式
GIT_REGEX="((http|https|git)://|git@)($GIT_DOMAINS)[/:][a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+"
DEFAULT_CLONE_DIR="$HOME/Downloads"      # 默认克隆目录
CUSTOM_CLONE_DIR="$HOME/code"            # 自定义克隆目录（可修改为你的常用目录）

# 如果历史文件不存在则创建
[ -f "$HISTORY_FILE" ] || touch "$HISTORY_FILE"

# ==============================================================================
# TODO 1: add more custom dir example (自定义目录示例，取消注释即可使用)
# 如需添加更多预设目录，可参考以下方式扩展choose_clone_dir函数：
# 1. 新增目录变量（如：WORK_CLONE_DIR="$HOME/work/git"）
# 2. 在dir_choice的echo中添加选项（如："工作目录 ($WORK_CLONE_DIR)"）
# 3. 在case分支中添加匹配（如：*"工作目录"*) echo "$WORK_CLONE_DIR" ;;）
# ==============================================================================
# WORK_CLONE_DIR="$HOME/work/git"        # 示例：工作相关Git仓库目录
# STUDY_CLONE_DIR="$HOME/study/git"      # 示例：学习相关Git仓库目录

# 添加当前剪贴板内容到历史记录（去重）
add_to_history() {
    # 获取剪贴板内容（忽略空内容错误）
    current=$(xclip -selection clipboard -o 2>/dev/null)
    # 清理内容：移除空行、空字符和非URL前缀文本（确保仅保留纯Git URL）
    current=$(echo "$current" | sed -e ':a' -e '/^\n*$/{$d;N;ba' -e '}' \
                                    -e 's/^.*http/http/' \  # 移除http前的多余文本
                                    -e 's/^.*git@/git@/' | # 移除git@前的多余文本
                                    tr -d '\0')            # 移除空字符
    
    [ -z "$current" ] && return  # 跳过空内容
    
    # 仅保留符合Git URL格式的内容，避免无效文本存入历史
    if echo "$current" | grep -qE "$GIT_REGEX"; then
        # 如果内容不存在于历史中则追加，并截断为最大条目数（保留最新）
        if ! grep -qxF "$current" "$HISTORY_FILE"; then
            echo "$current" >> "$HISTORY_FILE"
            tail -n "$MAX_ENTRIES" "$HISTORY_FILE" > "$HISTORY_FILE.tmp"
            mv "$HISTORY_FILE.tmp" "$HISTORY_FILE"
        fi
    fi
}

# 选择克隆目录（函数名保持原逻辑，内部预留扩展示例）
choose_clone_dir() {
    # 构造目录选项（可根据TODO 1的扩展示例添加更多选项）
    dir_choice=$(echo "默认目录 ($DEFAULT_CLONE_DIR)\n自定义目录 ($CUSTOM_CLONE_DIR)" | 
                 # TODO: 如需添加工作/学习目录，取消下方注释并调整
                 # echo "默认目录 ($DEFAULT_CLONE_DIR)\n自定义目录 ($CUSTOM_CLONE_DIR)\n工作目录 ($WORK_CLONE_DIR)\n学习目录 ($STUDY_CLONE_DIR)" | 
                 dmenu -i -p "选择克隆目录:" -l 2)  # -l 2：显示2行选项（扩展后需改为对应行数，如-l 4）
    
    # 根据选择返回目录路径
    case "$dir_choice" in
        *"自定义目录"*)
            echo "$CUSTOM_CLONE_DIR"
            ;;
        # TODO: 如需添加工作目录匹配，取消下方注释
        # *"工作目录"*)
        #     echo "$WORK_CLONE_DIR"
        #     ;;
        # TODO: 如需添加学习目录匹配，取消下方注释
        # *"学习目录"*)
        #     echo "$STUDY_CLONE_DIR"
        #     ;;
        *)  # 默认选择"默认目录"
            echo "$DEFAULT_CLONE_DIR"
            ;;
    esac
}

# ==============================================================================
# TODO 2: git clone output dir prompt as user defines (用户自定义克隆目录示例)
# 如需让用户手动输入克隆目录（而非仅选择预设目录），可替换choose_clone_dir函数为以下逻辑：
# function choose_clone_dir_manual() {
#     # 1. 先让用户选择预设目录或"手动输入"
#     dir_mode=$(echo "使用预设目录\n手动输入目录" | dmenu -i -p "克隆目录选择模式:" -l 2)
#     if [ "$dir_mode" = "使用预设目录" ]; then
#         # 沿用原有预设目录选择逻辑
#         dir_choice=$(echo "默认目录 ($DEFAULT_CLONE_DIR)\n自定义目录 ($CUSTOM_CLONE_DIR)" | 
#                      dmenu -i -p "选择预设目录:" -l 2)
#         case "$dir_choice" in
#             *"自定义目录"*) echo "$CUSTOM_CLONE_DIR" ;;
#             *) echo "$DEFAULT_CLONE_DIR" ;;
#         esac
#     else
#         # 2. 手动输入目录（用dmenu的-p参数提示，-l 1显示输入框）
#         manual_dir=$(echo "" | dmenu -i -p "请输入克隆目录（绝对路径）:" -l 1)
#         # 检查输入目录是否有效，无效则 fallback 到默认目录
#         if [ -n "$manual_dir" ] && mkdir -p "$manual_dir" 2>/dev/null; then
#             echo "$manual_dir"
#         else
#             echo "警告：输入目录无效，使用默认目录"
#             echo "$DEFAULT_CLONE_DIR"
#         fi
#     fi
# }
# ==============================================================================

# ==============================================================================
# TODO 3: add git args (Git克隆参数扩展示例，取消注释即可使用)
# 如需添加更多git clone参数（如指定分支、取消浅克隆等），可修改clone_cmd：
# 1. 浅克隆+指定分支：clone_cmd="git clone --depth=1 -b main \"$chosen\" \"$target_path\""
# 2. 完整克隆（取消浅克隆）：clone_cmd="git clone \"$chosen\" \"$target_path\""
# 3. 稀疏克隆（仅拉取指定目录）：clone_cmd="git clone --depth=1 --filter=blob:none --sparse \"$chosen\" \"$target_path\" && cd \"$target_path\" && git sparse-checkout set src"
# ==============================================================================

# 1. 显示Git仓库历史（函数名明确化：原show_git_history拆分为显示和处理两步）
display_git_history() {
    # 提取唯一的有效Git仓库地址（去重+排序）
    git_entries=$(grep -E "$GIT_REGEX" "$HISTORY_FILE" | sort -u)
    
    # 若历史中无Git仓库，提示并退出
    if [ -z "$git_entries" ]; then
        echo "历史记录中没有Git仓库地址"
        exit 1
    fi

    # 格式化Git平台提示（如："Git仓库 (gitee.com github.com codeberg.org):"）
    git_domains_display=$(echo "$GIT_DOMAINS" | sed 's/|/ /g')
    # 用dmenu显示仓库列表，让用户选择（-i：不区分大小写，-l 15：显示15行）
    chosen=$(echo "$git_entries" | dmenu -i -p "Git仓库 ($git_domains_display):" -l 15)
    
    # 若用户未选择（直接关闭dmenu），退出脚本
    [ -n "$chosen" ] || exit 1

    # 再次清理选中的URL（防止历史记录中混入多余文本）
    chosen=$(echo "$chosen" | sed -e 's/^.*http/http/' -e 's/^.*git@/git@/')
    echo "$chosen"  # 将选中的URL输出给后续处理函数
}

# 2. 处理Git克隆逻辑（函数名明确化：专注于克隆执行）
process_git_clone() {
    local chosen="$1"  # 接收从display_git_history传来的选中URL

    # 选择克隆目录（如需使用手动输入目录，将下方一行替换为：clone_dir=$(choose_clone_dir_manual)）
    local clone_dir=$(choose_clone_dir)
    # 确保目录存在（若不存在则创建）
    mkdir -p "$clone_dir" || { echo "无法创建目录: $clone_dir"; exit 1; }

    # 提取仓库名称（自动去除.git后缀，如"lowfi.git"→"lowfi"）
    local repo_name=$(basename "$chosen" .git)
    local target_path="$clone_dir/$repo_name"

    # 显示关键信息（选中的仓库+目标路径）
    echo "选中的Git仓库: $chosen"
    echo "目标路径: $target_path"
    
    # 检查目标目录是否已存在（避免git clone报错）
    if [ -d "$target_path" ]; then
        echo "错误：目录 '$target_path' 已存在（非空目录）"
        exit 1
    fi

    # 构建克隆命令（默认浅克隆--depth=1，如需扩展参数参考TODO 3）
    local clone_cmd="git clone --depth=1 \"$chosen\" \"$target_path\""
    # TODO: 如需添加分支参数，取消下方注释并修改分支名（如main/dev）
    # local clone_cmd="git clone --depth=1 -b main \"$chosen\" \"$target_path\""
    # TODO: 如需完整克隆（无浅克隆），取消下方注释
    # local clone_cmd="git clone \"$chosen\" \"$target_path\""

    # 确认是否执行克隆（用dmenu让用户二次确认）
    local confirm=$(echo "是\n否" | dmenu -i -p "执行命令: $clone_cmd?")
    if [ "$confirm" = "是" ]; then
        echo "正在克隆仓库（可能需要片刻，取决于网络）..."
        # 执行克隆命令
        eval "$clone_cmd"
        # 检查克隆结果并提示
        if [ $? -eq 0 ]; then
            echo "✅ 克隆成功！仓库位于: $target_path"
        else
            echo "❌ 错误：克隆失败（请检查网络或仓库地址）"
        fi
    else
        echo "ℹ️  已取消克隆"
    fi

    # 将选中的URL重新复制到剪贴板（方便后续再次使用）
    echo "$chosen" | xclip -selection clipboard
}

# 主流程：添加剪贴板内容 → 显示Git历史 → 处理克隆
add_to_history
selected_git_url=$(display_git_history)  # 1. 显示历史并获取选中URL
process_git_clone "$selected_git_url"    # 2. 传入选中URL执行克隆
